package w83a.w83aUtilidadesComunes;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

/**
 * Excepción lanzada cuando se produce un error reseñable. <br>
 * <br>
 * Además de la información contenida en todos los objetos Exception (message,
 * cause y stack trace), cada instancia de esta clase puede contener también un
 * código de error.
 */

public class W83aException extends Exception implements Serializable {

  /**
	 * Comment for <code>serialVersionUID</code>
	 */
	private static final long serialVersionUID = 1L;


/**
    * Construye un objeto de la clase.
    * 
    * @param errorCode
    *           Código de error.
    *  
    */

   public W83aException(long errorCode) {

      this("w83a", errorCode, null);
   }

 /**
   * Construye un objeto de la clase.
   * 
   * @param applicCode  
   * 			Código de aplicacion (w83a para este codigo).
   * @param errorCode
   *           Código de error.
   *  
   */

   public W83aException(String applicCode,  long errorCode) {

     this(applicCode, errorCode, null);
   }
   
   /**
    * Construye un objeto de la clase.
    *
    * @param message
    *           Mensaje de error.
    */
   public W83aException(String message) {

      this("w83a", message, null);
   }

   /**
    * Construye un objeto de la clase.
    * 
    * @param cause
    *           Excepción que ha causado ésta.
    * 
    */

   public W83aException(Throwable cause) {

      this("w83a",  0, cause);
   }

   /**
    * Construye un objeto de la clase.
    * 
    * @param applicCode  
    *			Código de aplicacion (w83a para este codigo)
    * 
    * @param cause
    *           Excepción que ha causado ésta.
    * 
    */

   	public W83aException(String applicCode,Throwable cause) {

   		this(applicCode,  0, cause);
   	}
   
   /**
	 * Constructor de la clase.
	 * 
	 * @param errorCode
	 *            Código de error.
	 * @param cause
	 *            Excepción que ha causado ésta.
	 */
   
	public W83aException(long errorCode, Throwable cause) {
	
		this("w83a", errorCode, cause);
		
	}   

   /**
    * Construye un objeto de la clase.
    * 
    * @param errorCode
    *           Código de error.
    * @param cause
    *           Excepción que ha causado ésta.
    * 
    */
   public W83aException(String applicCode, long errorCode, Throwable cause) {

   	super(cause);
   	this.errorCode = errorCode;
    this.errorMessage = loadMessage(Locale.getDefault());//NOPMD
   	this.applicationCode = applicCode;
   }
   
   
   /**
    * Construye un objeto de la clase.
    * 
    * @param applicCode
    * 			Codigo de la aplicacion (w83a para este codigo)
    * @param message
    *           Mensaje de error.
    * @param cause
    *           Excepción que ha causado ésta.
    */

   public W83aException(String applicCode, String message, Throwable cause) {

      super(message, cause);
      this.errorMessage = message;
      this.applicationCode = applicCode;
   }

   /**
    * Construye un objeto de la clase.
    * 
    * @param applicCode
    * 			Codigo de la aplicacion (w83a para este codigo)
    * @param errorCode
    *           Código de error.
    * @param cause
    *           Excepción que ha causado ésta.
    * 
    * @param asyncErrorValues
    * 			Conjunto de pares valor que van al cuerpo del mensaje del propagador enrutador
    */
   public W83aException(String applicCode, long errorCode, Throwable cause, HashMap asyncErrorValues) {

   	super(cause);
   	this.errorCode = errorCode;
   	this.errorMessage = loadMessage(Locale.getDefault());//NOPMD
   	this.applicationCode = applicCode;
    this.asyncErrorValues = asyncErrorValues; 
   }
   
   
   /**
    * Construye un objeto de la clase.
    * 
    * @param applicCode
    * 			Codigo de la aplicacion (w83a para este codigo)
    * @param message
    *           Mensaje de error.
    * @param cause
    *           Excepción que ha causado ésta.
    * @param asyncErrorValues
    * 			Conjunto de pares valor que van al cuerpo del mensaje del propagador enrutador
    */

   public W83aException(String applicCode, String message, Throwable cause, HashMap asyncErrorValues) {

      super(message, cause);
      this.errorMessage = message;
      this.applicationCode = applicCode;
      this.asyncErrorValues = asyncErrorValues; 
   }

   /**
    * Devuelve el código de error. <br>
    * El valor del código de error es 0 si éste no se ha establecido
    * 
    * @return El código de error mencionado.
    */

   public long getErrorCode() {

      return errorCode;
   }

   /**
    * Devuelve el mensaje de error.
    * 
    * @return El mensaje de error mencionado.
    */

   public String getMessage() {

      return errorMessage;
   }
   
   
   /**
    * Carga un mensaje de error del archivo de recursos en el idioma
    * especificiado.
    * 
    * @param locale
    *           Código de localización con el idioma especificado.
    * @return El mensaje de error mencionado.
    */

   protected String loadMessage(Locale locale) {//NOPMD
	   String idioma=locale.getLanguage();
	  
	   if(idioma==null || (idioma!=null && !idioma.equalsIgnoreCase("es") && !idioma.equalsIgnoreCase("eu"))){
		   locale=new Locale("es");	
	   }
	   
      if (getCause() == null){
         return getExtendedMessage(locale);
      }
      else {
         StringBuffer sbf = new StringBuffer();
         sbf.append(getExtendedMessage(locale));
         sbf.append(" {\n ");
         sbf.append(getCause().getMessage());
         sbf.append("\n}");
         return sbf.toString();
      }
   }

   /**
    * Carga un mensaje de error del archivo de recursos en el idioma
    * especificiado.
    * 
    * @param locale
    *           Código de localización con el idioma especificado.
    * @return El mensaje de error mencionado.
    */

   protected String getExtendedMessage(Locale locale) {

      String msg = null;
      ResourceBundle resBundle;

      if (errorCode != 0) {
         try {
            resBundle = ResourceBundle.getBundle(getMessagesFile(), locale);
            msg = resBundle.getString(Long.toString(errorCode));
         }
         catch (MissingResourceException mre) {
            msg = null;
//            mre.printStackTrace(System.err);
            W83aClsTrazas.trazaError(null,mre.getLocalizedMessage(),mre);
         }
         catch (Exception exc) {
            msg = null;
//            exc.printStackTrace(System.err);
            W83aClsTrazas.trazaError(null,exc.getLocalizedMessage(),exc);
         }
      }
      return msg;
   }

   /**
    * Devuelve el nombre del archivo de recursos que contiene los mensajes para
    * esta excepción.
    * 
    * @return El nombre del archivo de recursos mencionado.
    */

   public String getMessagesFile() {

      return RESOURCE_FILE;
   }

    
   public HashMap getAsyncErrorValues() {
       return asyncErrorValues;
   }
   public void setAsyncErrorValues(HashMap propEnrutador) {
       this.asyncErrorValues = propEnrutador;
   }

   protected long errorCode;
   protected String errorMessage;
   protected String applicationCode;
   protected HashMap asyncErrorValues;


   private static String RESOURCE_FILE = "/html/datos/properties/w83arecursosErrores";
}